//package org.chs.ts.batch.execute.task;
//
//
//import com.alibaba.fastjson.JSONObject;
//import com.sun.deploy.util.ParameterUtil;
//import com.sun.istack.internal.NotNull;
//import lombok.extern.slf4j.Slf4j;
//import org.chs.ts.batch.util.TaskBuilder;
//import org.springframework.scheduling.annotation.EnableScheduling;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.OutputStream;
//
///**
// * 定时任务：批量发送短信service
// *
// * @Author: JL
// */
//@EnableScheduling
//@Component
//@Slf4j
//public class NoteBatchTaskService {
//
//    /**
//     * 文件名
//     */
//    private static final String FILE_NAME = "MWBP_FAILURE_TAKE_DELIVERY_";
//    /**
//     * 文件类型
//     */
//    private static final String FILE_TYPE = ".txt";
//
//    /**
//     * 路径间隔符，默认为
//     */
//    private static final String PATH_SEPARATOR = "/";
//
//    /**
//     * 批量短信 约定交易码
//     */
//    private static final String CHANNEL_CODE = "011705";
//
//    @Resource
//    private ParameterUtil parameterUtil;
//
//    //todo-wuwei:待定
////    @Resource
////    private PmcsTradeSmsSendLogMapper smsSendLogMapper;
//
//    //todo-wuwei:待定
////    @Resource
////    private PmcsSmsWarnGenerateReportLogMapper smsWarnGenerateReportLogMapper;
//
//    //todo-wuwei:待定
////    @Resource
////    private ITransApi iTransApi;
//
//    @Resource
//    private TaskBuilder taskBuilder;
//
//    @Resource
//    private TempTokenUtil tempTokenUtil;
//
//    @Resource
//    private FileSftp fileSftp;
//
//    @Resource
//    private RedissonLockService redissonLockService;
//
//    // 测试用： 30秒1次
////    @Scheduled(cron = "30 * * * * ?")
//
//    /**
//     * 上线用：每天凌晨5点开始任务：在配置时间批量给客户发送提货短信
//     */
//    @Scheduled(cron = "0 0 5 * * ?")
//    public void process() {
//        redissonLockService.dealLockAndUnlock("noteBatchTaskKey", () -> {
//            log.info("推送未提货用户短信提醒任务开始");
//            // 实时查询数据库如果已经推送过了就不再继续推送
//            String coreDay = taskBuilder.getCoreDay();
//            PmcsSmsWarnGenerateReportLog reportLog = queryTodayNoteLog(coreDay);
//            if (reportLog != null && ParamWordbook.GENERATE_STATUS_1.equals(reportLog.getGenerateStatus())) {
//                log.info("短信记录已经生成,无需再继续推送");
//                return;
//            }
//            // 定义文件名
//            String fileName = FILE_NAME + coreDay + FILE_TYPE;
//            // 定义压缩文件名
//            String fileNameToZip = FILE_NAME + coreDay;
//
//            try {
//                // 查询 到期需要提醒的 用户信息
//                List<PmcsTradeSmsSendLog> smsSendLogs = getSmsEndLogs();
//                if (Util.isNullOrEmpty(smsSendLogs)) {
//                    log.info("未能查询到超时未提货客户信息,任务结束.");
//                    return;
//                }
//                log.info("查询到超时未提货客户信息,输出文件开始.");
//                String context = getRowsBySmsSendLogs(smsSendLogs);
//
//                String smsUrl = getSmsUrl();
//                String filePathStr = getLocalBaseUrl() + coreDay + File.separator + smsUrl + File.separator;
//
//                File filePath = new File(filePathStr);
//                File file = new File(filePathStr + fileName);
//                // 获取上一级目录，不存在则创建
//                createFolder(filePathStr, filePath);
//                // 创建文件
//                createFile(fileName, file);
//                log.info("生成本地文件成功！ 文件路径{},文件名{}", filePathStr, fileName);
//                // 数据写入本地文件
//                dataWriteToFile(fileName, context, filePathStr, file);
//                log.info("文件输出流写入成功！开始生成压缩文件");
//                // 开始压缩文件
//                File[] files = new File[]{file};
//                boolean fileToZip = ZipUtil.zipFile(filePathStr, fileNameToZip, files);
//                if (!fileToZip) {
//                    log.info("生成压缩文件失败！");
//                    // 压缩文件异常失败,则直接退出,不再做上传动作.
//                    return;
//                }
//                log.info("压缩文件创建成功！,准备上传压缩文件");
//                String destMessageFilePath = gtpOrSftpUpload(fileNameToZip, smsUrl, filePathStr);
//                log.info("上传压缩文件结束");
//
//                // 调用 批量发短信接口
//                log.info("调用批量发短信接口开始");
//                boolean success = callSendBatchMsg(fileNameToZip, Long.toString(file.length()), destMessageFilePath);
//                log.info("调用批量发短信接口结束");
//                // 写入 执行日志表
//                writeReportLog(coreDay, reportLog, success);
//
//                log.info("推送未提货用户短信提醒任务结束");
//            } catch (ServiceException e) {
//                log.error("ServiceException:", e);
//                throw new ServiceException(e.getCode(), e.getDesc());
//            } catch (Exception e) {
//                log.error("Exception:", e);
//                throw new ServiceException(RetCode.ERR_SYSTEM_ERROR, e.getMessage());
//            }
//        }, new ServiceException(RetCode.FAILED, "未能获取锁，等待下次重新获取"));
//    }
//
//    /**
//     * 根据上传压缩文件结果 ：写入数据库执行记录信息
//     *
//     * @param coreDay   当前日期
//     * @param reportLog 执行记录对象
//     * @param success   上传压缩文件结果
//     */
//    private void writeReportLog(String coreDay, PmcsSmsWarnGenerateReportLog reportLog, boolean success) {
//        if (success) {
//            // 记录 本次调用记录
//            log.info("记录调用消息推送平台记录开始");
//            if (reportLog != null) {
//                updateReportLog(reportLog);
//            } else {
//                saveReportLog(coreDay);
//            }
//            log.info("记录调用消息推送平台记录结束");
//        }
//    }
//
//    /**
//     * 文件不存在则创建文件
//     *
//     * @param fileName 文件名
//     * @param file     文件对象
//     */
//    private void createFile(String fileName, File file) throws IOException {
//        if (!file.exists()) {
//            boolean result = file.createNewFile();
//            log.info("文件不存在,创建文件名：{},创建结果：{}", fileName, result);
//        }
//    }
//
//    /**
//     * 文件夹不存在则创建文件夹
//     *
//     * @param filePathStr 文件夹路径
//     * @param filePath    文件夹对象
//     */
//    private void createFolder(String filePathStr, File filePath) {
//        if (!filePath.exists()) {
//            boolean result = filePath.mkdirs();
//            log.info("文件夹不存在,创建文件夹：{},创建结果：{}", filePathStr, result);
//        }
//    }
//
//    /**
//     * GTP或者SFTP进行上传压缩文件
//     *
//     * @param fileNameToZip 压缩文件名称
//     * @param smsUrl        短信服务专属路径
//     * @param filePathStr   本地文件路径
//     * @return 远端相对路径
//     */
//    @NotNull
//    private String gtpOrSftpUpload(String fileNameToZip, String smsUrl, String filePathStr) {
//        // 连接GTP 或 SFTP
//        String gtpOrSftp = parameterUtil.getParameterByCode(ParamConstant.GTP_OR_SFTP);
//        String[] configParams;
//        // 远端相对路径
//        String destMessageFilePath = getSysCode() + File.separator + smsUrl + File.separator;
//        String p;
//        if (PmcsConstant.ERR_PMCS_GTP_SFTP.equals(gtpOrSftp)) {
//            // 上传使用GTP
//            configParams = getGtpConfig();
//            p = parameterUtil.getParameterByCode(ParamConstant.GTP_P_SM4);
//            String localFilePath = filePathStr + fileNameToZip;
//            String remoteFilePath = destMessageFilePath + fileNameToZip;
//            log.info("GTP uploadFile start");
//            log.info("GTP uploadFile localFilePath={}", localFilePath);
//            log.info("GTP uploadFile remoteFilePath={}", remoteFilePath);
//            GtpUtil.uploadFile(configParams[0], Integer.parseInt(configParams[1]), configParams[2], p, localFilePath, remoteFilePath);
//            log.info("GTP uploadFile end");
//        } else {
//            // 上传使用SFTP
//            configParams = getSftpConfig();
//            p = parameterUtil.getParameterByCode(ParamConstant.SFTP_P_SM4);
//            // 上传全路径=配置绝对远端路径+报文读取路径
//            String remoteFilePath = getSftpBaseUrl() + destMessageFilePath;
//            log.info("SFTP uploadFile start");
//            log.info("SFTP uploadFile remoteFilePath={},remoteFileName={}", remoteFilePath, fileNameToZip);
//            log.info("SFTP uploadFile localFilePath={},localFileName={}", filePathStr, fileNameToZip);
//            boolean success = fileSftp.uploadFile(configParams[0], Integer.parseInt(configParams[1]), configParams[2], p, remoteFilePath,
//                    fileNameToZip, filePathStr, fileNameToZip);
//            if (!success) {
//                throw new ServiceException(RetCode.ERR_R02_110, RetCode.ERR_R02_110_MSG, filePathStr + fileNameToZip);
//            }
//            log.info("SFTP uploadFile end");
//        }
//        return destMessageFilePath;
//    }
//
//    /**
//     * 将查到的数据写入文件
//     * @param fileName 文件名称
//     * @param context 数据信息
//     * @param filePathStr 文件夹路径
//     * @param file 文件对象
//     */
//    private void dataWriteToFile(String fileName, String context, String filePathStr, File file) {
//        try (OutputStream outToFile = new FileOutputStream(file, false)) {
//            // 不组合，每次重新复写
//            outToFile.write(context.getBytes());
//        } catch (IOException e) {
//            log.error("IOException: ", e);
//            throw new ServiceException(RetCode.ERR_R02_110, RetCode.ERR_R02_110_MSG, filePathStr + fileName);
//        }
//    }
//
//    //todo-wuwei:待定
//    /**
//     * 批量发短信
//     *
//     * @param fileName            tar文件名称
//     * @param fileSize            tar file size
//     * @param destMessageFilePath 远端相对路径
//     * @return 返回是否成功
//     */
//    public boolean callSendBatchMsg(String fileName, String fileSize, String destMessageFilePath) {
////        SMS002Request request = new SMS002Request();
////        request.setCommonRequestHead(new CommonRequestHead());
////        //虚拟机构
////        String hostBrId = parameterUtil.getParameterByCode("hostBrId");
////        //虚拟柜员
////        String hostTlrNo = parameterUtil.getParameterByCode("hostTlrNo");
////        // 渠道号: 20230313与金欣沟通，送0117，不送011701
////        String channelCode = parameterUtil.getParameterByCode(ParamConstant.PMCS_SYS_CODE);
////        request.getCommonRequestHead().setBrId(hostBrId);
////        request.getCommonRequestHead().setTlrNo(hostTlrNo);
////
////        String gtpPath = "/DownDir0/" + destMessageFilePath;
////        // 定时时间
////        String smsPushTime = parameterUtil.getParameterByCode(ParamConstant.SMS_PUSH_TIME);
////        if (smsPushTime == null) {
////            //默认上午9：00
////            smsPushTime = "09:00:00";
////        }
////        String timingTime = DateUtils.date2Str(DateUtils.DATE_SDF.get()) + " " + smsPushTime;
////        // 定时时间
////        request.setTmg(timingTime);
////        // 批量名称
////        request.setBtchNm("贵金属系统客户未提货短信提醒");
////        // 备注
////        request.setRemark("贵金属系统客户未提货短信提醒");
////        // 渠道号
////        request.setChnlNo(channelCode);
////        // 交易码
////        request.setTranNo(CHANNEL_CODE);
////        // 子序号
////        request.setSubSeqNo("0");
////        // 全国渠道标志 1 -全国，2 - 省内，默认国内渠道
////        request.setAllCtyChnlFlg("1");
////        // 企业客户标志 1 -企业，2 -个人，默认个人
////        request.setEntpCstFlg("2");
////        // 批量文件信息数组
////        SMS002ArrayRequest sms002ArrayRequest = new SMS002ArrayRequest();
////        // 批量文件名称
////        sms002ArrayRequest.setBtchFileNm(fileName);
////        // 批量文件大小
////        sms002ArrayRequest.setBtchFileSz(fileSize);
////        // 批量文件下载地址
////        sms002ArrayRequest.setBtchFileUrl(gtpPath + fileName);
////        // 批量文件信息数组
////        request.getBtchFileArray().add(sms002ArrayRequest);
////        log.info("发送短信推送报文：{}", JSON.toJSONString(request));
////        try {
////            // 添加临时token
////            UserTokenContext.setToken(tempTokenUtil.getTempToken());
////            SMS002Response sms002Response = iTransApi.sendBatchMsg(request);
////            String returnCode = sms002Response.getCommonResponseHead().getReturnCode();
////            String returnMsg = sms002Response.getCommonResponseHead().getReturnMsg();
////            log.info("sms returnCode:{},returnMsg:{}", returnCode, returnMsg);
////            return RetCode.SUCCESS.equals(returnCode);
////        } finally {
////            // 删除临时token
////            UserTokenContext.remove();
////        }
//
//        return false;
//    }
//
//    //todo-wuwei:待定
//    /**
//     * 查询是否已存在当日推送消息推送记录
//     *
//     * @return PmcsSmsWarnGenerateReportLog
//     */
//    private PmcsSmsWarnGenerateReportLog queryTodayNoteLog(String coreDay) {
////        QueryWrapper<PmcsSmsWarnGenerateReportLog> reportLogQueryWrapper = new QueryWrapper<>();
////        reportLogQueryWrapper.lambda().eq(PmcsSmsWarnGenerateReportLog::getGenerateDate, coreDay);
////        return smsWarnGenerateReportLogMapper.selectOne(reportLogQueryWrapper);
//        return null;
//    }
//
//    //todo-wuwei:待定
//    /**
//     * 保存推送记录信息
//     *
//     * @param coreDay 核心当前日期
//     */
//    private void saveReportLog(String coreDay) {
////        PmcsSmsWarnGenerateReportLog reportLog = new PmcsSmsWarnGenerateReportLog();
////        reportLog.setGenerateDate(coreDay);
////        reportLog.setGenerateStatus(ParamWordbook.GENERATE_STATUS_1);
////        smsWarnGenerateReportLogMapper.insert(reportLog);
//
//    }
//
//    //todo-wuwei:待定
//    /**
//     * 更新推送记录信息
//     *
//     * @param reportLog 推送记录对象
//     */
//    private void updateReportLog(PmcsSmsWarnGenerateReportLog reportLog) {
////        reportLog.setGenerateStatus(ParamWordbook.GENERATE_STATUS_1);
////        smsWarnGenerateReportLogMapper.updateById(reportLog);
//    }
//
//    /**
//     * 获取Gtp配置
//     *
//     * @return String[]
//     */
//    private String[] getGtpConfig() {
//        String config = parameterUtil.getParameterByCode(ParamConstant.SMS_GTP_CONFIG);
//        return CheckGtpOrSftp.chkGtpOrSftp(config);
//    }
//
//    /**
//     * 获取Sftp配置
//     *
//     * @return String[]
//     */
//    private String[] getSftpConfig() {
//        String config = parameterUtil.getParameterByCode(ParamConstant.SMS_SFTP_CONFIG);
//        return CheckGtpOrSftp.chkGtpOrSftp(config);
//    }
//
//    /**
//     * 获取 贵金属系统编码
//     *
//     * @return 0117
//     */
//    private String getSysCode() {
//        return parameterUtil.getParameterByCode(ParamConstant.PMCS_SYS_CODE);
//    }
//
//    /**
//     * 获取短信平台对应URL
//     *
//     * @return smsUrl
//     */
//    private String getSmsUrl() {
//        return parameterUtil.getParameterByCode(ParamConstant.SMS_URL);
//    }
//
//    /**
//     * 获取sftp 根路径
//     *
//     * @return sftpBaseUrl
//     */
//    private String getSftpBaseUrl() {
//        String sftpBaseUrl = parameterUtil.getParameterByCode(ParamConstant.SFTP_BASE_URL);
//        return sftpBaseUrl.replace(PATH_SEPARATOR, File.separator);
//    }
//
//    /**
//     * 获取本地上传文件路径
//     *
//     * @return localBaseUrl
//     */
//    private String getLocalBaseUrl() {
//        String localBaseUrl = parameterUtil.getParameterByCode(ParamConstant.LOCAL_UPLOAD_BASE_URL);
//        return localBaseUrl.replace(PATH_SEPARATOR, File.separator);
//    }
//
//    //todo-wuwei:待定
//    /**
//     * 查询到货次日和后天的信息，并发起提醒
//     *
//     * @return List<PmcsTradeSmsSendLog>
//     */
//    private List<PmcsTradeSmsSendLog> getSmsEndLogs() {
////        QueryWrapper<PmcsTradeSmsSendLog> queryWrapper = new QueryWrapper<>();
////        queryWrapper.lambda().eq(PmcsTradeSmsSendLog::getTakeStatus, ParamWordbook.TAKE_STATUS_0);
////        // 由于当前时间已经是跑批过的时间，已切日，所以需获取日切前日期为交易第二天，前日为交易第三天
////        String transSecondDay = taskBuilder.getDayBy(-1);
////        String transThirdDay = taskBuilder.getDayBy(-2);
////        queryWrapper.lambda().in(PmcsTradeSmsSendLog::getPushDate, Arrays.asList(transSecondDay, transThirdDay));
////        return smsSendLogMapper.selectList(queryWrapper);
//        return null;
//    }
//
//    /**
//     * 返回信息内容：手机号;您尾号{{cardNo}}账户{{tranTime}}购买的{{orderNo}}的{{productName}}已于{{fewDays}}到达{{branchName}}，
//     * 请您尽快持有效身份证件前往预约网点进行提货，客服电话96368。"
//     *
//     * @param smsSendLogs List<PmcsTradeSmsSendLog>
//     * @return String
//     */
//    private String getRowsBySmsSendLogs(List<PmcsTradeSmsSendLog> smsSendLogs) {
//        StringBuilder sb = new StringBuilder();
//        for (PmcsTradeSmsSendLog sendLog : smsSendLogs) {
//            if (Util.isNullOrEmpty(sendLog.getOrderCode())) {
//                log.error("有异常数据进入库中，请开发人员定位分析，异常数据ID:{}", sendLog.getId());
//                continue;
//            }
//            sb.append(sendLog.getPmcsCustNo()).append(";");
//            sb.append(sendLog.getPickTelno()).append(";");
//            // 业务参数: 键值对
//            JSONObject obj = new JSONObject();
//            // 卡号：保留后4位
//            obj.put("cardNo", sendLog.getAcctNo().substring(sendLog.getAcctNo().length() - 4));
//            // tranTime：交易日期
//            obj.put("tranTime", sendLog.getTransDate());
//            // 订单号 orderCode
//            obj.put("orderNo", sendLog.getOrderCode());
//            // 产品名称
//            obj.put("productName", sendLog.getProductName());
//            // 入库日期
//            obj.put("fewDays", sendLog.getPushDate());
//            // 预约网点名称
//            obj.put("branchName", sendLog.getSysOrgName());
//            sb.append(obj.toJSONString());
//            // 换行
//            sb.append("\r\n");
//        }
//        return sb.toString();
//    }
//
//
//}
